package com.zero.guava.samples.CollectionsDemo;


import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Range;

/**
 * Range 为一个可比较类型连续的值定义连续边界
 *
 * Range open(C lower, C upper)：返回一个Range，包含严格大于lower小于upper范围的所有值，数学表示（lower，upper）
 * Range closed(C lower, C upper)：返回一个Range，包含大于等于lower小于等于upper范围的所有值，数学表示 [ lower，upper ]
 * Range closedOpen( C lower, C upper)：返回一个Range，包含大于等于lower严格小于upper范围的所有值，数学表示 [ lower，upper )
 * Range openClosed( C lower, C upper)：返回一个Range，包含严格大于lower小于等于upper范围的所有值，数学表示 （lower，upper ]
 * Range range( C lower, BoundType lowerType, C upper, BoundType upperType)：返回一个Range，包含lower和upper范围的所有值，临界值的开闭可以通过BoundType设置，BoundType 是枚举类型，标识开闭。
 * Range lessThan(C endpoint)：返回严格小于endpoint的所有值Range
 * Range atMost(C endpoint)：返回小于等于endpoint的所有值Range
 * Range upTo( C endpoint, BoundType boundType)：返回上限临界值为endpoint的区间，上限开闭性由boundType指定
 * Range greaterThan(C endpoint)：返回严格大于endpoint的所有值Range
 * Range atLeast(C endpoint)：返回大于等于endpoint的所有值Range
 * Range downTo( C endpoint, BoundType boundType)：返回下限临界值为endpoint的区间，下限开闭性由boundType指定
 * Range all()：返回包含类型C所有值的Range
 * Range singleton(C value)：返回唯一包含传入value的Range
 * Range encloseAll( Iterable values)：返回Range与传入values比较后的最小范围区间
 * boolean hasLowerBound()：返回Range是否存在下限
 * C lowerEndpoint()：返回Range下限的临界点值
 * BoundType lowerBoundType()：返回Range的下限类型BoundType，即开闭性
 * boolean hasUpperBound()：返回Range是否存在上限
 * C upperEndpoint()：返回Range上限的临界点值
 * BoundType upperBoundType()：返回Range的上限类型BoundType，即开闭性
 * boolean isEmpty()：判断Range是否为空，即上下限是否相等
 * boolean contains(C value)：判断Range中是否包含指定的value
 * boolean containsAll(Iterable<? extends C> values)：判断指定values中是否所有值都包含在Range中
 * boolean encloses(Range other)：返回传入Range是否包含在调用此方法的Range中
 * boolean isConnected(Range other)：返回两个Range是否能够连续上
 * Range intersection(Range connectedRange)：返回两个Range的最大交集，如果Range无交集，抛出异常IllegalArgumentException
 * Range span(Range other)：返回两个Range的并集
 * Range canonical(DiscreteDomain domain)：返回在给定domain离散域下Range的规范形式
 */
public class RangeDemo {

    public static void main(String[] args) {
        RangeTest();
    }
    public static void RangeTest(){
        /**
         * 定义一个返回Person年龄的函数
         */
        Function ageFunction = new Function<Person, Integer>() {
            @Override
            public Integer apply(Person input) {
                return input.getAge();
            }
        };
        //定义一个年龄大于等于25小于30岁的区间
        Range<Integer> ageRange = Range.closedOpen(25, 30);
        //定义一个对于指定区间年龄Person的过滤
        // 注：Range实现了Predicate接口，所以compose方法可以接口ageRange
        Predicate<Person>  personPredicate = Predicates.compose(ageRange, ageFunction);
        Person person = new Person("张三", 30);
        System.out.println(personPredicate.apply(person));
    }
}
